home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / cmln0386.arc / MATCH3.PRO < prev    next >
Text File  |  1986-03-03  |  1KB  |  49 lines

  1. % Answer to the Prolog challenge from the AI Eye column in the March 1986
  2. % issue of Computer Language.  This version of Match implements pattern
  3. % variables of the form [=,name], as in:
  4. %
  5. %       Pattern         Example         Match?
  6. %
  7. %       [a,[=,x],c]     [a,b,c]         Yes, x=b
  8. %       [[=,y],[=,y]]   [a,a]           Yes, x=a
  9. %       [[=,y],[=,y]]   [a,b]           No
  10. %
  11. % No, the code isn't commented.  Can you figure out why it works and how
  12. % it differs from the version of Match published in March?  Answers (and
  13. % comments!) in May.
  14.  
  15. append([],L,L).
  16. append([X|L1],L2,[X|L3]) :- append(L1,L2,L3).
  17.  
  18. member(X,[X|_]).
  19. member(X,[_|Y]) :- member(X,Y).
  20.  
  21. bind([N | V], B, B) :-
  22.      member([N | V], B).
  23.  
  24. bind([N | V], B, [[N | V] | B]) :-
  25.      not(member([N | X], B)).
  26.  
  27. match(P,E) :- match(P,E,[],_).
  28.  
  29. match([],[],B,B).
  30.  
  31. match([EH | PT], [EH | ET], B1, B) :-
  32.       match(PT,ET,B1,B).
  33.  
  34. match([+ | PT], E, B1, B) :-
  35.       append([EH | _],ET,E),
  36.       match(PT,ET,B1,B).
  37.  
  38. match([? | PT], [EH | ET], B1, B) :-
  39.       match(PT,ET,B1,B).
  40.  
  41. match([[=, N] | PT], [EH | ET], B1, B) :-
  42.       bind([N,EH], B1, B2),
  43.       match(PT,ET,B2,B).
  44.  
  45. match([PH | PT], [EH | ET], B1, B) :-
  46.       match(PH,EH,B1,B2),
  47.       match(PT,ET,B2,B).
  48.  
  49.